// let intNum = 070
// let intNum1 = 0o70
// console.log(intNum);
// console.log(intNum1);
// let intNum2 = 080 // 超过八进制表示范围当作十进制
//   // 八进制字面量在严格模式报错
// console.log(intNum2);

// let hexNum1 = 0xA // 十六进制
// console.log(hexNum1);

// console.log(+0 === -0);

// // 1.浮点数
// // 因为存储浮点值所使用的内存空间是存储整数的两倍，所以js总是想办法把值转换为整数
// let floatNum1 = 1.
// let floatNum2 = 10.0
// let floatNum3 = 10.1
// console.log(floatNum1); // 1
// console.log(floatNum2); // 10
// console.log(floatNum3); // 10.1

// // 2.科学计数法
// let floatNum = 3.12e7
// console.log(floatNum);
// let floatNum4 = 0.0000000001
// console.log(floatNum4); // js默认会把小数点后至少包含六个零的浮点数转换为科学技术法
// let floatNum5 = 1000000000
// console.log(floatNum5);

// 浮点数的精度最高可达17位小数，算数运算中不如整数准确
// 不要测试某个特定的浮点值
// console.log(0.1 + 0.2);

// 3.值得范围
// console.log(Number.MAX_VALUE);
// console.log(Number.MIN_VALUE); // 最小的数值
// console.log(Number.MAX_VALUE * 2);
// console.log(Number.MIN_VALUE > 0);
// console.log(Number.MAX_VALUE * -300);

// console.log(isFinite(1)); // 判断一个值是不是有限大
// console.log(isFinite(Infinity)); // 判断一个值是不是有限大

// console.log(Number.NEGATIVE_INFINITY); // -Infinity
// console.log(Number.POSITIVE_INFINITY); // Infinity

// 4.NaN 
// 表示本来要返回数值的操作失败了
// console.log(0 / 0); //NaN
// console.log(5 / 0); // Infinity

// // 任何设计NaN的运算操作结果都返回NaN
// console.log(NaN + 1); // NaN
// // NaN不等于包括NaN在内的任何值
// console.log(NaN == NaN);
// // isNaN()函数 ---> 判断传入的内容是否能转换为数值
// console.log(isNaN(NaN)); // true
// console.log(isNaN(1 + 1)); // false
// console.log(isNaN("1")); // false
// console.log(isNaN('blue')); // true
// console.log(isNaN(true)); // false
// console.log(isNaN(false)); // false
// console.log(isNaN(undefined)); // true

// // isNaN() 还会测试对象，会先调用对象的valueOf(),判断返回的值是否能转换为数字，如果没有valueOf()方法，再调用toString()方法
// let obj = {
//   // valueOf() {
//   //   console.log('valueOf');
//   //   // return "20"
//   // },
//   toString() {
//     console.log('toString');
//     return "30"
//   }
// }
// console.log(isNaN(obj));

// 5.数值转换
// console.log(Number(true)); // 1
// console.log(Number(false)); // 0
// console.log(Number(1)); // 1
// console.log(Number(null)); // 0
// console.log(Number(undefined)); // NaN
// console.log(Number("1")); // 1
// console.log(Number("01")); // 1
// console.log(Number("1.1")); // 1.1
// console.log(Number("0xf")); // 15
// console.log(Number("")); // 0
// 除了上述情况之外转换为NaN
// null ---> 0,undefined ---> NaN
// 如果是对象的话，有valueOf调用valueOf，没有就调用toString
// let obj = {
//   // valueOf() {
//   //   console.log('valueOf');
//   //   // return '123'
//   // },
//   toString() {
//     console.log('toString');
//     return '321'
//   }
// }

// console.log(Number(obj));
// console.log(Number(" 0001"));

// parseInt()和parseFloat()更专注于字符串转换为数字，如果第一个非空格字符不是+-或者数字直接返回NaN
// 空字符串返回NaN,Number()空字符串返回0
// 如果第一个非空字符是数字，则会依次往后知道不是数字为止
// console.log(parseInt('1234bl;ue')); // 1234
// console.log(parseInt(22.2)); // 22
// console.log(parseInt("")); // NaN
// console.log(parseInt("0xA")); // 10
// console.log(parseInt("10", 16)); // 16
// console.log(parseInt('1010', 2)); // 10

// // parseFloat()从第一个非空数字字符开始解析直到末尾或者解析到一个无效的浮点数字字符
// console.log(parseFloat('n1.2')); // NaN
// console.log(parseFloat('12.2.2')); // 12.2
// console.log(parseFloat('12.0')); // 12

// // parseFloat只解析10进制数，所有字符开头的0都会被自动忽略(忽略了八进制)，所有十六进制都返回0
// console.log(parseFloat("012")); // 12
// console.log(parseFloat("0x10")); // 0
// console.log(parseFloat("08")); // 8